Workflow Templateのmanifestの例を読んで構造を捉える
from Workflow Template (argo)
Workflow Template (argo)のmanifestは、認知コストが高い
初見では何が書いているかさっぱりわからんmrsekut.icon
デザインセンス皆無
以下はGPT-4.iconに生成してもらったサンプルで、これを読んでいく
これを読む。初見で意味がわかるかな?
code:yml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: get-user-info
spec:
entrypoint: main-step
templates:
- name: main-step
inputs:
parameters:
- name: user-id
value: "12345"
outputs:
parameters:
- name: user-info
valueFrom:
parameter: '{{steps.fetch-user.outputs.parameters.result}}'
steps:
- - name: fetch-user
arguments:
parameters:
- name: args
value: >-
get-user --id={{inputs.parameters.user-id}}
- name: user-id
value: '{{inputs.parameters.user-id}}'
templateRef:
name: common-ops
template: fetch-user-by-id
yamlは、Kubernetes manifestと同じ形式なので、以下の4つは必須
apiVersion
kind
WorkflowTemplateやねmrsekut.icon
metadata.name
spec
重要なのはこれなので、これの中身を呼んでいく
specの直下は、以下の2つ
entrypoint
templatesの中の、どのtemplateを最初に呼び出すかを指定
templates
本題
この辺は、他のkindであっても共通することも多いぽい
WorkflowとWorkflowTemplateのspecの中身
ref WorkflowSpec
templatesの中を見ると、stepsがあるのがわかる
そのため、これはSteps Templateであるということがわかる
クソ分かりづらいけどなmrsekut.icon
templatesの直下の項目は、以下のように捉えると良いmrsekut.icon
name
関数名みたいな感じ
inputs
関数の仮引数の定義という感じ
outputs
関数の返り値という感じ
steps
関数の内部実装の定義という感じ
したがって、
inputs/outputsがインターフェイスで、stepsがその詳細であるし、
実際に実行したときは、inputs → steps → outputsという感じで流れる
一つずつ見てみようmrsekut.icon
inputs
code:yml
inputs:
parameters:
- name: user-id
value: "12345"
これは仮引数の定義だと捉える
nameは引数名
valueはデフォルト値である
これほんまわかりにくいと思うmrsekut.icon
outputs
code:yml
outputs:
parameters:
- name: user-info
valueFrom:
parameter: '{{steps.fetch-user.outputs.parameters.result}}'
関数の返り値の定義のようなもの
内部実装(step/fetch-user)の出力outputをuser-infoという名前で出力パラメータとして扱う
steps
code:yml
steps:
- - name: fetch-user
arguments: # 関数呼出しに与える実引数
parameters:
- name: args
value: >-
get-user --id={{inputs.parameters.user-id}}
- name: user-id
value: '{{inputs.parameters.user-id}}'
templateRef: # 関数呼出し的な
name: common-ops
template: fetch-user-by-id
関数の内部実装のようなもの
今回の例では一つのstep fetch-userのみが定義されている
ここでは、別のtemplateを呼んでいる
別の関数を呼んでいるのをイメージすれば良いmrsekut.icon
templateRefで
外部のテンプレート common-ops/fetch-user-by-id を呼び出している感じ
common-opsは、WorkflowTemplateのmedtadata.nameのこと
Workflow Templateのmanifestの例を読んで構造を捉える#6852d537000000000087b1c5みたいなもの
fetch-user-by-idは、その中のtemplateの名前
Workflow Templateのmanifestの例を読んで構造を捉える#6852d537000000000087b1c9みたいなもの
argumentsが↑これに与える実引数という感じ
common-ops/fetch-user-by-idが2つのinputsを要求しているはずで、
それに対してargsとuser-idの2つの実引数を渡している感じ
argsのところは、コンテナ内でコマンドを実行してその結果を実引数として使っている感じ
$ get-user --id=12345
どうでも良いが、common-ops templateがあるとしたら以下のような感じ
code:yml
apiVersion: argoproj.io/v1alpha1
kind: WorkflowTemplate
metadata:
name: common-ops # ← これが templateRef.name で使われる名前
spec:
templates:
- name: fetch-user-by-id # ← 呼び出されるテンプレート名
inputs:
parameters:
- name: args
- name: user-id
outputs:
parameters:
- name: result # 上のoutputsで参照されてるやつ
valueFrom:
path: /tmp/result.json
container:
image: alpine
command: "sh", "-c"
args:
- |
echo "Fetching user with ID {{inputs.parameters.user-id}}"
echo '{"id": "{{inputs.parameters.user-id}}", "name": "Alice"}' > /tmp/result.json